查看原文
其他

《爱上潘大师》系列-你还记得那年的DataFrame吗

小一 小一的学习笔记 2023-01-01

2020,努力做一个无可替代的人!


作者 | 小一

全文共2327字,阅读全文需9分钟





写在前面的话

如果你还记得那年大明湖畔的xiaoyige,那你就应该来看看这篇文章

我们学的是技术,小一我写的可是技术文章,哪来那么多情啊爱啊的

今天的内容很重要的!

先复习一下前面的文章:

可能有的同学不理解复习的意义,我简单说一下:

我写系列文章的时候都会先列好整个系列的大纲,甚至有时候几篇文章是同一天肝出来的。

这就造成有时候这一篇文章的概念会及其依赖上一篇文章,所以呢,花个两三分钟复习一下上一篇,你会更好理解这篇文章。


正文

今天介绍潘大师的另一种数据结构:Dataframe,一个表格型的数据结构。

对于Series 我们只用了一小节介绍,而Dataframe 可能会用三节内容,孰轻孰重应该都清楚吧

学习DataFrame,小一建议你最好和Excel表格联系起来

Excel 表格有行索引、列索引,有数据块,有数据的查找、替换、去重,有数据的透视,汇总,有不同表的数据匹配等等这些。

DataFrame 的初衷就是为了解决这些问题,简洁、易用的功能也是作者最初的愿景

所以 ,后面的系列文章,如果你对某个概念不是很理解,想一想 Excel 中是怎么表述的

创建 DataFrame

先来一个DataFrame 介绍三连

DataFrame 有行(索引)、有列(索引),可以看做是由一个个的Series 组成的字典。

DataFrame 每列可以是不同的值类型(数值、字符串、布尔值)

DataFrame 中的数据是以一个或多个二维块存放的

那DataFrame 都有哪些创建方式?

和NumPy 一样,DataFrame 创建方式也有很多种

常见的有:
  • 通过二维ndarray 创建
  • 通过字典创建
  • 通过列表创建
  • 通过另一个DataFrame 创建

下面简单介绍一下常用的,剩下的同学们自己拓展

通过二维ndarray创建DataFrame

创建一个二维的ndarray 数组,该数组即DataFrame 的数据集

# 通过二维ndarray创建DataFrame
arr_data = np.arange(12).reshape(34)
df_data1 = pd.DataFrame(arr_data)

# 输出
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

结果DataFrame 会自动加上行索引和列索引,和Series 的创建一样

那应该怎么显示声明行、列索引?

也和Series 的创建一样,在创建的时候手动指定就行

# 通过二维ndarray创建DataFrame
columns = ['one''two''three''four']
index = ['a''b''c']
# 显示指定行、列索引
df_data1 = pd.DataFrame(arr_data, columns=columns, index=index)

# 输出
   one  two  three  four
a    0    1      2     3
b    4    5      6     7
c    8    9     10    11
记住列索引(想要成Excel 的列名):columns
行索引(想象成Excel 的序号):index
默认的行列索引都是从0开始

通过字典创建DataFrame
这里面的字典包括很多,比如:
  • 数组、元祖 、列表 组成的字典

  • 字典组成的字典(嵌套)

  • Series 组成的字典

只要数据是字典格式,就可以做数据集

字典的key作为DataFrame的列索引

# 通过字典创建DataFrame
dict_data = {
    'name': ['xiaoyi''xiaosi''xiaoqi'],
    'age': [111417],
    'score': [95.594.597]
}
df_data2 = pd.DataFrame(dict_data)

# 输出
     name  age  score
0  xiaoyi   11   95.5
1  xiaosi   14   94.5
2  xiaoqi   17   97.0

列索引是字典的 key 值,行索引自动填充

当然字典里面的值数据类型你可以尽情变化,Series、元祖、列表等都是可以的

通过列表创建DataFrame

同样的,这里的列表类型也不止一种:

  • 字典组成的列表

  • Series 组成的列表
# 通过列表创建DataFrame
list_data = [
    {'one'1'two'2},
    {'one'1'two'2'three'4}
]
df_data3 = pd.DataFrame(list_data)

# 输出
   one  two  three
0    1    2    NaN
1    1    2    4.0

主要就是这三种创建方式,有些书上写的过于复杂,让人眼花缭乱

万变不离其宗,核心就是这三种

至于第四种通过其他DataFrame创建,就不多说了吧?

经常读我文章的同学要是会了前三种,还不会第四种?

不妨看一下NumPy 的数组创建?顺便反思一下?

索引对象

DataFrame 已经创建好了,但是索引还不太明白,是和Series的一样吗?

能想到Series,说明你差不多都知道是怎么回事了

构建Series 或者DataFrame 时,所用到的任何数据的标签都会被转换成Index对象

Index 对象是不可修改的,这样可以保证多个数据结构之间的安全共享

毕竟人家可是索引,你索引要是都一样了,那到底应该指向谁就说不清了

我们可以使用重新索引的方法 reindex

reindex 的用处相当大,我详细介绍一下参数

reindex(index, method, fille_value, limit, level, copy)

参数说明
index用作索引的新序列
method插值(填充)方式,包括:ffill(前向填充值)、bfill(后向填充值)
fill_value在重新索引的过程中,需要引入缺失值时使用的替代值
limit前向或后向填充时的最大填充量

在DataFrame中,存在行、列索引,不同于Series 中只有单一索引。

所以DataFrame中 reindex 可以行、列索引都修改

先看单一索引

# 创建 Series
series_data = pd.Series([1245], index=['a''b''c''e'])
# 输出
a    1
b    2
c    4
e    5
dtype: int64

# 重新索引
series_data = series_data.reindex(['a''b''c''d''e'], fill_value=-1)
# 输出
a    1
b    2
c    4
d   -1
e    5
dtype: int64

reindex 会根据新索引进行重排,如果某个索引值不存在,则使用 fille_value 的值进行填充

还记得前面说的DataFrame 中行、列索引分别是什么吗?

  • 行索引:index (想象成Excel 中的序号)

  • 列索引:columns  (想象成Excel 中的列名)
df_data2
# 输出
     name  age  score
0  xiaoyi   11   95.5
1  xiaosi   14   94.5
2  xiaoqi   17   97.0

# 行、列重新索引
columns = ['name''age''score''score2']
index = [0123]
df_data2 = df_data2.reindex(index=index, columns=columns)
# 输出
     name   age  score  score2
0  xiaoyi  11.0   95.5     NaN
1  xiaosi  14.0   94.5     NaN
2  xiaoqi  17.0   97.0     NaN
3     NaN   NaN    NaN     NaN

对行、列都进行重新索引,索引值不存在的会用空值填充

索引很重要,是Pandas 数据模型的重要部分,但是我们了解上面的内容就够了,也没必要去深究它。



总结一下:

今天主要介绍了DataFrame 的创建和索引的相关操作。

创建方法也是一如既往的多,不过不要慌,真正用起来的时候基本都是从文件中读数据,就一个方法。

索引这一块不要搞混行索引、列索引。

对于索引的一些方法最好是掌握,我写出来的都是常用的,不是常用的我也懒得写,你要是还纠结建议你去查API 文档细品


写在后面的话

每天进步一点点,学习不就是这么来的吗?

写这篇文章的时候,我接到了一个关系很好的朋友的消息。

他的考研成绩公布了,边工作边复习的他,考研历程是我认识的人中最艰难的、最辛苦的。

等他有空,我去取取经,投稿部分应该会有新文章,期待一下

碎碎念一下
上一节碎碎念太多,一下没控制住自己
算算时间,去年十二月份定下的小目标:每周两篇原创文 ,除了春节期间,应该都实现了。

加油加油




好巧啊,你也读到这了!    

点个在看让我看到你


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存